import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

// 获取初始化的购物车列表
const initCart = JSON.parse(uni.getStorageSync('cart') || '[]')
// 获取初始化的用户信息
const initUserInfo = JSON.parse(uni.getStorageSync('userinfo') || '{}')
// 获取初始化的 token
const initToken = uni.getStorageSync('token') || ''

export const store = new Vuex.Store({
  state: {
    // 每个商品对象中，都包含 6 个属性，分别是：
    // goods_id, goods_name, goods_price, goods_small_logo, goods_count, is_checked
    cart: initCart,
    // 用户信息
    userInfo: initUserInfo,
    // 登录成功之后的 token 字符串
    token: initToken
  },
  mutations: {
    // 加入购物车
    addToCart(state, goods) {
      const filterResult = state.cart.filter(x => x.goods_id === goods.goods_id)
      if (filterResult.length === 0) {
        // 向购物车中添加新商品
        state.cart.push(goods)
      } else {
        // 只更新数量
        filterResult[0].goods_count++
        // 让当前商品处于勾选状态
        filterResult[0].is_checked = true
      }
      this.commit('saveToStorage')
    },
    // 将 Store 中购物车的数据持久化存储到 storage
    saveToStorage(state) {
      uni.setStorageSync('cart', JSON.stringify(state.cart))
    },
    // 更新商品数量
    updateGoodsCount(state, info) {
      // 根据商品Id，查找对应的商品信息
      const goods = state.cart.find(x => x.goods_id === info.goods_id)
      if (!goods) return
      // 更新商品数量
      goods.goods_count = info.count - 0
      // 持久化存储
      this.commit('saveToStorage')
    },
    // 更新商品的选中状态
    updateGoodsChecked(state, info) {
      // 根据商品Id，查找对应的商品信息
      const goods = state.cart.find(x => x.goods_id === info.goods_id)
      if (!goods) return
      goods.is_checked = info.is_checked
      this.commit('saveToStorage')
    },
    // 更新所有商品的选中状态
    updateAllChecked(state, is_checked) {
      state.cart.forEach(x => x.is_checked = is_checked)
      this.commit('saveToStorage')
    },
    // 删除商品
    removeGoods(state, goods_id) {
      state.cart = state.cart.filter(x => x.goods_id !== goods_id)
      this.commit('saveToStorage')
    },
    // 更新用户的基本信息
    updateUserInfo(state, userInfo) {
      state.userInfo = userInfo
    },
    // 更新 token 字符串
    updateToken(state, token) {
      state.token = token
    }
  },
  getters: {
    // 购物车中商品总数量（已勾选 + 未勾选）
    goodsTotal(state) {
      let total = 0
      state.cart.forEach(x => total += x.goods_count)
      return total
    },
    // 勾选的商品总数量
    checkedGoodsTotal(state) {
      let total = 0
      state.cart.forEach(x => {
        if (x.is_checked) {
          total += x.goods_count
        }
      })
      return total
    }
  }
})
